package com.cpimex.eprice.model;

import java.sql.*;
import java.util.*;
import com.cpimex.eprice.bean.GrupoBean;
import com.cpimex.eprice.bean.LineaBean;
import com.cpimex.eprice.bean.GrupoProdBean;

public class Grupo{

	public final String ACTUALIZAR = "actualizarGrupo";
	public final String EDITAR = "editarGrupo";
	public final String EDITARPROD = "editarProd";
	public final String ELIMINAR = "eliminarGrupo";
	public final String LISTAR   = "listarGrupo";
	public final String LISTARGPOPROD = "listGrupoProd";
	public final String LISTARPROD = "listProducto";
	public final String INSERTPROD = "insertProducto";
	public final String DELGPOPROD = "deleteProducto";
	private final boolean DEBUG = false;


	public ArrayList listarGrupo(Statement stmt, String str_nomina) throws SQLException {
		ArrayList arr_grupo = new ArrayList();
		ResultSet rs = null;
		String str_query = " SELECT g.id_grupo, " +
		"        g.desc_grupo," +
		"        g.linea_grupo," +
		"        CASE" +
		"             WHEN SUM(pl.id_grupo) is null then 1 " +
		"                     ELSE 0 " +
		"             END borrar_grupo, " +
		"        CASE " +
		"             WHEN SUM(g.linea_grupo) is null then 1 "+
		"                    ELSE 0 "+
		"             END borrar_prod "+
		" FROM ep_grupo g " +
		"       LEFT JOIN ep_precioLista pl " +
		"       ON g.id_grupo = pl.id_grupo " +
		"       inner join ( "+
		"                select	 top 1 codigo_clProd " +
		"                from	 ep_claseProducto " +
		"                where	 responsable_clProd = '"+str_nomina+"' " +
		"                order by codigo_clProd " +
		"        ) as ep_claseProducto on ep_claseProducto.codigo_clProd = g.claseProducto_grupo " +
		" GROUP BY g.id_grupo, " +
		"          g.desc_grupo, " +
		"          g.linea_grupo " +
		" ORDER BY g.desc_grupo ";

		rs = stmt.executeQuery(str_query);
		boolean bool_fila = false;

		while(rs.next()){
			GrupoBean bn_grupo = new GrupoBean();

			String str_idGrupo = rs.getString("id_grupo");
			String str_descGrupo = rs.getString("desc_grupo");
			String str_lineaGrupo = rs.getString("linea_grupo");
			int int_eliminar = rs.getInt("borrar_grupo");
			int int_editarProd = rs.getInt("borrar_prod");
			Map map_urlEliminar = new HashMap();
			Map map_urlActualizar = new HashMap();
			Map map_urlProducto = new HashMap();

			map_urlEliminar = mapa_editarMapa(str_idGrupo , ELIMINAR);
			map_urlActualizar = mapa_editarMapa(str_idGrupo, EDITAR);
			map_urlProducto = mapa_editarMapa(str_idGrupo, LISTARGPOPROD);
			map_urlProducto.put(EDITARPROD, String.valueOf(int_editarProd));


			bn_grupo.setStr_idGrupo(str_idGrupo);
			bn_grupo.setStr_descGrupo(str_descGrupo);
			bn_grupo.setStr_lineaGrupo(str_lineaGrupo);
			bn_grupo.setMap_urlActualizar(map_urlActualizar);
			bn_grupo.setMap_urlEliminar(map_urlEliminar);
			bn_grupo.setMap_urlProducto(map_urlProducto);
			bn_grupo.setBool_fila(bool_fila);
			bn_grupo.setInt_eliminar(int_eliminar);
			bn_grupo.setInt_eliminarProd(int_editarProd);

			bool_fila = !bool_fila;

			arr_grupo.add(bn_grupo);
		}
		rs.close();
		stmt.close();
		return arr_grupo;
	}

	public ArrayList listarLinea(Statement stmt, String str_linea) throws SQLException {
		ArrayList arr_linea = new ArrayList();
		String str_query = " SELECT id_linea, " +
		"       desc_linea " +
		" FROM ep_vw_linea " +
		" WHERE id_linea not in " +
		" (SELECT linea_grupo FROM ep_grupo WHERE linea_grupo is not null AND linea_grupo!= '"+str_linea+"') ";
		ResultSet rs = stmt.executeQuery(str_query);

		while(rs.next()){
			String str_idLinea = rs.getString("id_linea");
			String str_descLinea = rs.getString("desc_linea");

			if(str_descLinea==null)
				str_descLinea = "";

			LineaBean bn_linea = new LineaBean();
			bn_linea.setStr_idLinea(str_idLinea);
			bn_linea.setStr_descLinea("(" + str_idLinea + ") - " +str_descLinea);

			arr_linea.add(bn_linea);
		}
		return arr_linea;
	}


	public int eliminarGrupo(Connection conn, int int_idGrupo) throws
	SQLException {
		int int_rows;
		String str_query = " DELETE FROM ep_grupo  " +
		" WHERE id_grupo =" + int_idGrupo + " ";
		Statement stmt = conn.createStatement();
		int_rows = stmt.executeUpdate(str_query);
		return int_rows;
	}

	public boolean actualizarGrupo(Connection conn, String str_idGrupo,
			String str_descGrupo, String str_lineaGrupo)
	throws SQLException {
		boolean bool_status = false;
		bool_status = valida(conn, str_idGrupo, str_descGrupo, str_lineaGrupo);

		if (bool_status){
			String str_query = "UPDATE ep_grupo SET desc_grupo = '" + str_descGrupo + "', " +
			" linea_grupo = " + (str_lineaGrupo.equals("")?" null ":" '" +str_lineaGrupo +"' ") + " " +
			" WHERE id_grupo = '" + str_idGrupo + "' ";
			String str_queryDel = "DELETE FROM ep_grupoProducto WHERE id_grupo = '"+str_idGrupo+"' ";


			Statement stmt = conn.createStatement();
			if(!str_lineaGrupo.equals(""))
				stmt.executeUpdate(str_queryDel);
			stmt.executeUpdate(str_query);

			stmt.close();
			return bool_status;
		}else{
			return bool_status;
		}
	}

	public boolean insertarGrupo(Connection conn, String str_descGrupo, String str_lineaGrupo, String str_nomina) throws
	SQLException {
		boolean bool_status = valida(conn, "0", str_descGrupo, str_lineaGrupo);

		if(bool_status){
			String str_query =
				" INSERT INTO ep_grupo(desc_grupo, linea_grupo, claseProducto_grupo) " +
				" SELECT   top 1 "+
				"         '"+ str_descGrupo +"', "+
				"          " +(str_lineaGrupo.equals("")?" null ":" '" +str_lineaGrupo +"' ") + ", "+
				"          codigo_clProd "+
				" FROM     ep_claseProducto "+
				" WHERE    responsable_clProd = '"+str_nomina+"' "+
				" ORDER BY codigo_clProd ";
			Statement stmt = conn.createStatement();
			stmt.executeUpdate(str_query);
			stmt.close();
			return bool_status;
		}else{
			return bool_status;
		}
	}


	public ArrayList muestraGrupo(Statement stmt, int int_idGrupo) throws
	SQLException {

		ArrayList arr_grupo = new ArrayList();
		ResultSet rs = null;
		String str_query = "SELECT id_grupo, " +
		" desc_grupo, " +
		" linea_grupo " +
		" FROM ep_grupo " +
		" WHERE id_grupo = '" + int_idGrupo + "'";

		rs = stmt.executeQuery(str_query);

		while (rs.next()) {
			String str_idGrupo = rs.getString("id_grupo");
			String str_descGrupo = rs.getString("desc_grupo");
			String str_lineaGrupo = rs.getString("linea_grupo");
			if(str_lineaGrupo==null)
				str_lineaGrupo="";

			arr_grupo.add(str_idGrupo);
			arr_grupo.add(str_descGrupo);
			arr_grupo.add(str_lineaGrupo);

		}
		return arr_grupo;
	}


	private boolean valida(Connection conn, String str_idGrupo,
			String str_descGrupo, String str_LineaGrupo) throws
			SQLException {
		int int_total = 0;
		Statement stmt_desc = conn.createStatement();
		Statement stmt_linea = conn.createStatement();
		ResultSet rs_desc = null;
		ResultSet rs_linea = null;

		String str_queryDesc = "SELECT COUNT(*) " +
		" AS total " +
		" FROM ep_grupo " +
		" WHERE desc_grupo = '"+ str_descGrupo +"'  ";
		String str_queryLinea = "SELECT COUNT(*) " +
		" AS total " +
		" FROM ep_grupo " +
		(str_LineaGrupo.equals("")?" WHERE linea_grupo is null ":" WHERE linea_grupo = '"+ str_LineaGrupo +"'  ");

		if(!str_idGrupo.equals("0")){
			str_queryDesc +=  " AND id_grupo != '"+ str_idGrupo +"'";
			str_queryLinea +=  " AND id_grupo != '"+ str_idGrupo +"'";
		}

		rs_desc = stmt_desc.executeQuery(str_queryDesc);
		while(rs_desc.next()){
			int_total = rs_desc.getInt("total");
		}
		if(int_total>0)
			return false;

		rs_linea = stmt_linea.executeQuery(str_queryLinea);
		while(rs_linea.next()){
			int_total = rs_linea.getInt("total");
		}
		if(!str_LineaGrupo.equals(""))
			if(int_total>0)
				return false;
		return true;
	}


	public ArrayList listadoGrpProd(Statement stmt, String str_idGrupo) throws
	SQLException {
		ArrayList arr_prodGrp = new ArrayList();
		String str_query = " SELECT codigo_prod," +
		"        descripcion_prod " +
		" FROM ep_vw_producto "+
		" WHERE id_grupo = '" + str_idGrupo + "' ";

		ResultSet rs = stmt.executeQuery(str_query);

		boolean bool_fila = false;
		while (rs.next()) {
			String str_codigoProd = rs.getString("codigo_prod");
			String str_descripcionProd = rs.getString("descripcion_prod");
			Map map_url = new HashMap();

			map_url.put("action", DELGPOPROD);
			map_url.put("id_grupo", str_idGrupo);
			map_url.put("codigo_prod", str_codigoProd);

			GrupoProdBean bn_grupo = new GrupoProdBean();

			bn_grupo.setStr_codigoProd(str_codigoProd);
			bn_grupo.setStr_descripcionProd(str_descripcionProd);
			bn_grupo.setBool_fila(bool_fila);
			bn_grupo.setMap_url(map_url);

			bool_fila = !bool_fila;
			arr_prodGrp.add(bn_grupo);
		}
		return arr_prodGrp;
	}

	public ArrayList listarProducto(Statement stmt, String str_idGrupo, String str_search) throws SQLException {
		ArrayList arr_producto = new ArrayList();

		if(!str_search.equals("")){
			String str_query = " SELECT codigo_prod," +
			"        descripcion_prod " +
			" FROM   ep_vw_producto " +
			" WHERE  id_grupo is null " +
			" AND    (codigo_prod LIKE '%" + str_search + "%' OR " +
			"        descripcion_prod LIKE '%" + str_search + "%') ";

			ResultSet rs = stmt.executeQuery(str_query);

			boolean bool_fila = false;
			while (rs.next()) {
				String str_codigoProd = rs.getString("codigo_prod");
				String str_descripcionProd = rs.getString("descripcion_prod");
				Map map_url = new HashMap();
				GrupoProdBean bn_grupo = new GrupoProdBean();

				map_url.put("action", INSERTPROD);
				map_url.put("codigo_prod", str_codigoProd);
				map_url.put("id_grupo", str_idGrupo);

				bn_grupo.setStr_codigoProd(str_codigoProd);
				bn_grupo.setStr_descripcionProd(str_codigoProd + " - " + str_descripcionProd);
				bn_grupo.setBool_fila(bool_fila);

				arr_producto.add(bn_grupo);

				bool_fila = !bool_fila;
			}
		}
		return arr_producto;
	}

	public void insertaProducto(Statement stmt,
			String[] str_select,
			String str_idGrupo) throws
			SQLException {

		if(str_select!= null){
			for(int int_i = 0 ; int_i<str_select.length; int_i++ ){
				String str_query = "INSERT INTO ep_grupoProducto " +
				"       (codigoPro_grupoProducto, " +
				"        id_grupo) " +
				"        VALUES('"+str_select[int_i]+"', '"+str_idGrupo+"')";
				stmt.executeUpdate(str_query);
			}
		}
	}

	public void eliminaProducto(Statement stmt, String str_codigoProd) throws
	SQLException {
		String str_query = "DELETE FROM ep_grupoProducto " +
		"       WHERE codigoPro_grupoProducto ='"+str_codigoProd+"' ";

		stmt.executeUpdate(str_query);
	}


	private Map mapa_editarMapa(String str_idGrupo , String str_accion){
		Map map_url = new HashMap();

		map_url.put("id_grupo", str_idGrupo);
		map_url.put("action", str_accion);

		return map_url;
	}

	public ArrayList buscarGrupo(Statement stmt, String str_search, String str_nomina) throws
	SQLException {
		ArrayList arrL_grupo = new ArrayList();
		String str_query = "SELECT id_grupo, " +
		" desc_grupo, " +
		" linea_grupo " +
		" FROM ep_grupo " +
		"       inner join ( "+
		"                select	 top 1 codigo_clProd " +
		"                from	 ep_claseProducto " +
		"                where	 responsable_clProd = '"+str_nomina+"' " +
		"                order by codigo_clProd " +
		"        ) as ep_claseProducto on ep_claseProducto.codigo_clProd = ep_grupo.claseProducto_grupo " +
		" WHERE desc_grupo LIKE '%" + str_search + "%' OR " +
		"       id_grupo LIKE '%"+str_search+"%'";
		if(DEBUG){System.out.println(str_query);}

		if(!str_search.equals("")){
			ResultSet rs = stmt.executeQuery(str_query);
			while (rs.next()) {
				String str_idGrupo = rs.getString("id_grupo");
				String str_descGrupo = rs.getString("desc_grupo");
				String str_lineaGrupo = rs.getString("linea_grupo");
				if (str_lineaGrupo == null)
					str_lineaGrupo = "";

				GrupoBean bn_grupo = new GrupoBean();
				bn_grupo.setStr_idGrupo(str_idGrupo);
				bn_grupo.setStr_descGrupo(str_descGrupo);
				bn_grupo.setStr_lineaGrupo(str_lineaGrupo);
				arrL_grupo.add(bn_grupo);
			}
		}

		
		return arrL_grupo;
	}
}
